package ws;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import org.orm.PersistentException;
import org.orm.PersistentTransaction;

import orm.Tan_tipoanotacion;

import com.google.gson.Gson;

import SOAPVO.AnotacionSOAPVO;

public class AnotacionSOA {

	private static final int ROW_COUNT = 100;

	/**
	 * Ingresa una nueva anotacion a los registros
	 * Si alguna variable es nula retorna 0, si algun registro no es encontrado retorna 1,
	 * si ocurre una excepcion retorna 2 y si es exitoso reorna 3
	 * 
	 * @param fecha
	 * @param descripcion
	 * @param idAlumno
	 * @param idAnotador
	 * @param idTipoAnotacion
	 * @param idSubsector
	 * @return
	 */
	public String add(String fecha, String descripcion, int idAlumno,
			int idAnotador, int idTipoAnotacion, int idSubsector) {

		String resultado = "";
		PersistentTransaction t;	
		
		// valida que los campos no vengan vacios.
		if ((fecha == null) || (fecha.equals("")) || (descripcion == null)
				|| (descripcion.equals("")) || (idTipoAnotacion == 0)
				|| (idAnotador == 0) || (idAlumno == 0) || (idSubsector == 0)) {
			resultado = "0";
		}// si los datos vienen vacios, devuelve un 0
			// si los datos no vienen vacios.
		else {
			try {
				
				//Transforma la fecha de string a date
				SimpleDateFormat formatfecha = new SimpleDateFormat("yyyy-MM-dd");
				Date fe = null;
				try {
					fe = formatfecha.parse(fecha);
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				t = orm.AnotacionPersistentManager.instance().getSession()
						.beginTransaction();
				// Instancia factory
				orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
				// Instancia DAO
				/*
				 * crea nueva anotacion
				 */
				orm.dao.Tan_anotacionDAO lormTan_anotacionDAO = lDAOFactory
						.getTan_anotacionDAO();
				// Instancia objeto orm (vo)
				orm.Tan_anotacion lormTan_anotacion = lormTan_anotacionDAO
						.createTan_anotacion();

				/*
				 * Buscar tipo de anotacion validar si no encuentra objeto y si
				 * no existe asignar 2 por default con el tipo anotacion neutra
				 */

				orm.dao.Tan_tipoanotacionDAO oRMTan_tipoanotacionDAO = lDAOFactory
						.getTan_tipoanotacionDAO();
				orm.Tan_tipoanotacion oRMTan_tipoanotacion = oRMTan_tipoanotacionDAO
						.loadTan_tipoanotacionByQuery("ta_id='"
								+ idTipoAnotacion + "'", null);
				// Si el objeto se encuentra vacio, asigna un 2
				if (oRMTan_tipoanotacion == null) {
					oRMTan_tipoanotacion = oRMTan_tipoanotacionDAO
							.loadTan_tipoanotacionByQuery("ta_id='2'", null);
				}
				/*
				 * Busca subsector
				 */
				orm.dao.Tan_subsectorDAO oRMTan_subsectorDAO = lDAOFactory
						.getTan_subsectorDAO();
				orm.Tan_subsector oRMTan_subsector = oRMTan_subsectorDAO
						.loadTan_subsectorByQuery("sub_id='" + idSubsector
								+ "'", null);

				/*
				 * Busca alumno
				 */
				orm.dao.Tan_alumnoDAO oRMTan_alumnoDAO = lDAOFactory
						.getTan_alumnoDAO();
				orm.Tan_alumno oRMTan_alumno = oRMTan_alumnoDAO
						.loadTan_alumnoByQuery("al_id='" + idAlumno + "'", null);

				/*
				 * Busca anotador
				 */

				orm.dao.Tan_anotadorDAO oRMTan_anotadorDAO = lDAOFactory
						.getTan_anotadorDAO();
				orm.Tan_anotador oRMTan_anotador = oRMTan_anotadorDAO
						.loadTan_anotadorByQuery(
								"anot_id='" + idAnotador + "'", null);
				// Valida que los objetos encontrados no sean nulos
				if ((oRMTan_alumno == null) || (oRMTan_anotador == null)
						|| (oRMTan_subsector == null)
						|| (oRMTan_tipoanotacion == null)) {
					resultado = "1";
				} else {// Si no son nulos, los agrega

					Date fCreacion = new Date();

					lormTan_anotacion.setAn_fecha(fe);
					lormTan_anotacion.setAn_descripcion(descripcion);
					lormTan_anotacion
							.setTan_tipoanotacionta(oRMTan_tipoanotacion);
					lormTan_anotacion.setTan_subsectorsub(oRMTan_subsector);
					lormTan_anotacion.setTan_alumnoal(oRMTan_alumno);
					lormTan_anotacion.setTan_anotadoranot(oRMTan_anotador);
					lormTan_anotacion.setAn_fcreacion(fCreacion);
					lormTan_anotacion.setAn_estaactivo(1);
					lormTan_anotacion.setAn_estaborrado(0);

					lormTan_anotacionDAO.save(lormTan_anotacion);

					t.commit();
					resultado = "3";

				}
			} catch (PersistentException e1) {
				// TODO Auto-generated catch block
				// e.printStackTrace();
				resultado = "2";
				e1.printStackTrace();
			}
		}
		return resultado;
	}

	/**
	 * Busca todas las anotaciones y las retorna como json.
	 * Si no encuentra anotaciones retorna 1, si las anotaciones fueron borradas retorna -1
	 * y si ocurre una excepcion retorna 2
	 * 
	 * @return
	 */
	public static String getAll() {

		String json = null;
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		Collection<AnotacionSOAPVO> coleccionAnotacionSOAPVO = new ArrayList<AnotacionSOAPVO>();
		orm.Tan_anotacion[] ormAnotaciones;
		try {

			ormAnotaciones = lDAOFactory.getTan_anotacionDAO()
					.listTan_anotacionByQuery(null, null);
			// busqueda de todos los registros existentes

			int length = ormAnotaciones.length;
			if (length == 0) {// si no se encontraron registros
				json = "1";
			} else {// si se encontraron registros
				for (int i = 0; i < length; i++) {
					// si la anotacion no esta borrada, se agrega
					if (ormAnotaciones[i].getAn_estaborrado() == 0) {
						AnotacionSOAPVO objeto = AnotacionSOAPVO
								.crearAnotacionSOAPVO(ormAnotaciones[i]);
						coleccionAnotacionSOAPVO.add(objeto);
					}
				}// fin guardando resultados
				if (coleccionAnotacionSOAPVO.isEmpty() == true) {
					json = "-1";
				} else {
					Gson gson = new Gson();
					json = gson.toJson(coleccionAnotacionSOAPVO);
				}
			}

		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			json = "2";
		}
		return json;
	}

	/**
	 * Busca una anotacion por id y la retorna como json.
	 * Si el id es nulo retorna 0, si no encuentra la anotacion retorna 1,
	 * si la anotacion fue borrada retorna -1 y si ocurre una excepcion retorna 2
	 * @param id
	 * @return
	 */
	public static String getById(int id) {

		String json = null;
		// Comprueba si la variable ingresada es nula
		if ((id == 0)) {
			// Retorna un 0, indicando que el dato ingresado es nulo
			json = "0";
		} else {
			orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
			Collection<AnotacionSOAPVO> coleccionAnotacionSOAPVO = new ArrayList<AnotacionSOAPVO>();
			orm.Tan_anotacion ormAnotaciones;
			try {

				ormAnotaciones = lDAOFactory.getTan_anotacionDAO()
						.loadTan_anotacionByQuery("an_id='" + id + "'", null);
				// busqueda de todos los registros existentes
				if (ormAnotaciones == null) {// si no se encontraron registros
					json = "1";
				} else {// si se encontraron registros
					//comprueba que no este borrada
					if (ormAnotaciones.getAn_estaborrado() == 0) {
						AnotacionSOAPVO objeto = AnotacionSOAPVO
								.crearAnotacionSOAPVO(ormAnotaciones);
						coleccionAnotacionSOAPVO.add(objeto);
					}// fin guardando resultados
					if (coleccionAnotacionSOAPVO.isEmpty() == true) {
						json = "-1";
					} else {
						Gson gson = new Gson();
						json = gson.toJson(coleccionAnotacionSOAPVO);
					}
				}
			} catch (PersistentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				json = "2";
			}
		}
		return json;
	}

	
	/**
	 * Elimina una anotacion de los registros
	 * Si el id es nulo retorna 0, si la anotacion no es encontrada retorna 1,
	 * si ocurre una excepcion retorna 2 y si es exitoso reorna 4
	 * @param id
	 * @return
	 */
	
	public String delete(int id) {
		String message = "";
		PersistentTransaction t;
		// valida si los campos solicitados vienen vacios.
		if ((id == 0)) {
			message = "0";
		}
		// si no vienen vacios.
		else {
			try {
				t = orm.AnotacionPersistentManager.instance().getSession()
						.beginTransaction();
				orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
				orm.dao.Tan_anotacionDAO lormTan_anotacionDAO = lDAOFactory
						.getTan_anotacionDAO();
				orm.Tan_anotacion[] ormAnotacion;
				// busqueda de la anotacion en la BD
				ormAnotacion = lDAOFactory.getTan_anotacionDAO()
						.listTan_anotacionByQuery("an_id='" + id + "'", null);
				int length2 = ormAnotacion.length;
				// si no se encuentran registros para el id.
				if (length2 == 0) {
					message = "1";
				}
				// si se encuentran registros para el id
				else {
					orm.Tan_anotacion lormTan_anotacion = lormTan_anotacionDAO
							.loadTan_anotacionByQuery("an_id=" + id, null);
					// se borra el registro.
					lormTan_anotacion.setAn_estaborrado(1);
					lormTan_anotacion.setAn_estaactivo(0);
					message = "4";
				}
				t.commit();
			} catch (PersistentException e1) {
				// TODO Auto-generated catch block
				message = " 2";
				// t.rollback();
				e1.printStackTrace();
			}
		}
		return message;
	}// fin borrar anotacion

	
	/**
	 * 
	 * @param id
	 * @param idTipoAnotacion
	 * @param descripcion
	 * @return
	 */
	
	public String update(int id, int idTipoAnotacion, String descripcion) {
		PersistentTransaction t;
		String message = "";
		// valida que los campos solicitados no vengan vacios.
		if ((id == 0) || (idTipoAnotacion == 0) || (descripcion == null)
				|| (descripcion.equals(""))) {
			message = "0";
		}
		// si no vienen vacios se inicia el proceso.
		else {
			try {
				t = orm.AnotacionPersistentManager.instance().getSession()
						.beginTransaction();
				orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
				orm.dao.Tan_anotacionDAO lormTan_anotacionDAO = lDAOFactory
						.getTan_anotacionDAO();
				orm.dao.Tan_tipoanotacionDAO lormTan_tipoAnotacionDAO = lDAOFactory
						.getTan_tipoanotacionDAO();
				// se busca el registro segun su id.
				orm.Tan_anotacion[] ormTan_anotacion = lDAOFactory
						.getTan_anotacionDAO().listTan_anotacionByQuery(
								"an_id='" + id + "'", null);
				int length = Math.min(ormTan_anotacion.length, ROW_COUNT);
				// si se encuentra registro se procede a actualizar
				if (length >= 1) {
					orm.Tan_anotacion lormTan_anotacion = lormTan_anotacionDAO
							.loadTan_anotacionByQuery("an_id='" + id + "'",
									null);
					orm.Tan_tipoanotacion lormTan_tipoAnotacion = lormTan_tipoAnotacionDAO
							.loadTan_tipoanotacionByQuery("ta_id='"
									+ idTipoAnotacion + "'", null);

					lormTan_anotacion
							.setTan_tipoanotacionta(lormTan_tipoAnotacion);
					lormTan_anotacion.setAn_descripcion(descripcion);

					Date fechaModificacion = new Date();
					lormTan_anotacion.setAn_fmodificacion(fechaModificacion);
					message = "5";
				} else {
					message = "1";
				}
				t.commit();
			} catch (PersistentException e1) {
				// t.rollback();
				message = "2";
				e1.printStackTrace();
			}
		}
		return message;
	}// fin método update

}
